// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境

// 初始化数据库
const db = cloud.database();

const getRecord = async (openid) => {
    // 返回数据库查询结果
    return await db.collection("record")
      .where({
          _openid: openid
      })
      .field({
          name: true,
          descript: true
      })
      .get();
}

// 查询数据
const getRelatedRecords = async () => {
  // 返回数据库查询结果
  return await db.collection("record")
    .aggregate()
    .lookup({
      from: 'blade',
      localField: 'blade',
      foreignField: '_id',
      as: 'bladeInfo'
    })
    .unwind({
      path: '$bladeInfo',
      preserveNullAndEmptyArrays: true // 关键：保持空记录
    })
    .lookup({
      from: 'rubber', 
      localField: 'forehandRubber',
      foreignField: '_id',
      as: 'forehandRubberInfo'
    })
    .unwind({
      path: '$forehandRubberInfo',
      preserveNullAndEmptyArrays: true // 关键：保持空记录
    })
    .lookup({
      from: 'rubber', 
      localField: 'backhandRubber',
      foreignField: '_id',
      as: 'backhandRubberInfo'
    })
    .unwind({
      path: '$backhandRubberInfo',
      preserveNullAndEmptyArrays: true // 关键：保持空记录
    })
    .project({
      _id: true,
      name: true,
      descript: true,
      blade: {
        $cond: {
            if: { $ifNull: ['$bladeInfo', false] },
            then: {
              _id: '$bladeInfo._id',
              name: '$bladeInfo.name',
              coverPath: '$bladeInfo.coverPath'
            },
            else: ''
        }
      },
      forehandRubber: {
        $cond: {
            if: { $ifNull: ['$forehandRubberInfo', false] },
            then: {
              _id: '$forehandRubberInfo._id',
              name: '$forehandRubberInfo.name',
              coverPath: '$forehandRubberInfo.coverPath'
            },
            else: ''
        }
      },
      backhandRubber: {
        $cond: {
            if: { $ifNull: ['$backhandRubberInfo', false] },
            then: {
              _id: '$backhandRubberInfo._id',
              name: '$backhandRubberInfo.name',
              coverPath: '$backhandRubberInfo.coverPath'
            },
            else: ''
        }
      },
    })
    .end();

  return await db.collection("record")
        .aggregate() // 使用聚合管道
        .lookup({
            from: 'blade', // 需要关联的表的名称，例如存储品牌信息的表叫 'brand'
            localField: 'blade', // rubber 表中的关联字段，存储的是品牌ID
            foreignField: '_id', // brand 表中被关联的字段，通常是 _id
            as: 'bladeInfo' // 将关联查询到的品牌详细信息放入这个新字段中
        })
        .unwind('$bladeInfo') // 将brandInfo数组展开为对象, 在一对一的时候
        // .lookup({
        //   from: 'rubber', 
        //   localField: 'forehandRubber',
        //   foreignField: '_id',
        //   as: 'forehandRubberInfo'
        // })
        // .unwind('$forehandRubberInfo') // 将brandInfo数组展开为对象, 在一对一的时候
        .project({
          _id: true,
          name: true,
          brandName: '$bladeInfo.name', // 将品牌名称映射到新的字段
          // forehandRubber: '$forehandRubberInfo.name',  // 正手胶皮信息 
        }).end();
};

// 添加数据
const addRecord = async (recordData, openid) => {
  const newRecord = {
    ...recordData,
    _openid: openid,  // 重要：使用_openid作为主键
    createdAt: db.serverDate(), // 服务器时间
    updatedAt: db.serverDate(),
  }

  try {
    const result = await db.collection("record").add({
      data: newRecord
    });
    
    return {
      success: true,
      id: result.id,
      message: '数据添加成功'
    };
  } catch (error) {
    console.error('添加数据失败:', error);
    return {
      success: false,
      message: '数据添加失败: ' + error.message
    };
  } 
}

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext();
  switch (event.type) {
    case "getRecord":
      return await getRecord(wxContext.OPENID);
    case "getRelatedRecords":
      return await getRelatedRecords();
    case "addRecord":
      return await addRecord(event.recordData, wxContext.OPENID);
  }
}
